package hocusPocus.IHM;

import hocusPocus.Cartes.Carte;
import hocusPocus.Controllers.ControllerInterfacePlateau;
import hocusPocus.Partie.Joueur;
import hocusPocus.Partie.Plateau;

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;

import javax.imageio.ImageIO;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.SwingConstants;
import javax.swing.border.TitledBorder;

import net.miginfocom.swing.MigLayout;

import com.mortennobel.imagescaling.experimental.ImprovedMultistepRescaleOp;
import java.awt.Component;
import java.awt.Color;

public class InterfacePlateau extends JPanel{
	public JButton btnJouerCarte, btnPasserTour, btnEchangerCartes;
	public final HashMap<JToggleButton, Carte> tableCorrespondance = new HashMap<JToggleButton, Carte>();
	private Plateau plateau ;
	private Joueur joueurCourant, joueurReagissant ;
	private JPanel panelListeJoueur, panelCartesJoueurCourant, panelChaudron, panelBibliotheque, panelZoneDeJeu, panelPlateauDeJeu, panelActionJoueur;
	private Carte carteSelectionnee;
	private int widthGrimoireJoueurAtt = 80; // Largeur cartes grimoire
	private int heightGrimoireJoueurAtt = 110; // Hauteur cartes grimoire
	private BufferedImage imageCarte ;
	private JPanel grimoire;
	private JPanel main;
	private JPanel panelDefausse;
	private JLabel lblCarteDefausse;
	private JLabel imageCarteDefausse;

	public InterfacePlateau() {
		this.plateau = Plateau.getInstance();
		this.joueurCourant = plateau.getJoueurCourant();
		this.joueurReagissant = plateau.getJoueurReagissant();
		
		setLayout(new BorderLayout(0, 0));

		panelListeJoueur = new JPanel();
		add(panelListeJoueur, BorderLayout.WEST);
		GridBagLayout gbl_listeJoueur = new GridBagLayout();
		gbl_listeJoueur.columnWidths = new int[] { 0, 0 };
		gbl_listeJoueur.rowHeights = new int[] { 0, 0, 0, 0, 0, 0, 0 };
		gbl_listeJoueur.columnWeights = new double[] { 1.0, Double.MIN_VALUE };
		gbl_listeJoueur.rowWeights = new double[] { 1.0, 1.0, 1.0, 1.0, 1.0,
				1.0, Double.MIN_VALUE };
		panelListeJoueur.setLayout(gbl_listeJoueur);
		afficherPanelListeJoueurs();

		panelPlateauDeJeu = new JPanel();
		add(panelPlateauDeJeu, BorderLayout.CENTER);
		panelPlateauDeJeu.setLayout(new GridLayout(2, 1, 0, 0));

		panelZoneDeJeu = new JPanel();
		panelZoneDeJeu.setBackground(new Color(34, 139, 34));
		panelZoneDeJeu.setBorder(new TitledBorder(null, "Zone de jeu",
				TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panelPlateauDeJeu.add(panelZoneDeJeu);
		afficherPanelZoneDeJeu();

		panelCartesJoueurCourant = new JPanel();
		panelCartesJoueurCourant.setLayout(new GridLayout(2, 1, 0, 0));

		grimoire = new JPanel();
		grimoire.setBorder(new TitledBorder(null, "Grimoire", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panelCartesJoueurCourant.add(grimoire);

		main = new JPanel();
		main.setBorder(new TitledBorder(null, "Main", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panelCartesJoueurCourant.add(main);
		afficherJoueurCourant();

		JPanel panelDroite = new JPanel();
		add(panelDroite, BorderLayout.EAST);
		panelDroite.setLayout(new GridLayout(0, 1, 0, 0));

		panelChaudron = new JPanel();
		panelDroite.add(panelChaudron);
		panelChaudron.setBorder(new TitledBorder(null, "Chaudron",
				TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panelChaudron.setLayout(new GridLayout(1, 1, 0, 0));
		afficherPanelChaudron();

		panelBibliotheque = new JPanel();
		panelBibliotheque.setBorder(new TitledBorder(null, "Bibliotheque",
				TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panelDroite.add(panelBibliotheque);
		panelBibliotheque.setLayout(new BoxLayout(panelBibliotheque, BoxLayout.Y_AXIS));
		afficherPanelBibliotheque();

		panelDefausse = new JPanel();
		panelDefausse.setBorder(new TitledBorder(null, "Defausse", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panelDroite.add(panelDefausse);
		panelDefausse.setLayout(new BoxLayout(panelDefausse, BoxLayout.Y_AXIS));
		afficherPanelDefausse();


		panelActionJoueur = new JPanel();
		panelDroite.add(panelActionJoueur);
		panelActionJoueur.setBorder(new TitledBorder(null, "Action Joueur",
				TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panelActionJoueur.setLayout(new MigLayout("", "[]", "[][][]"));
		afficherPanelActionJoueur();

	}

	public void afficherPanelActionJoueur() {
		this.joueurReagissant = plateau.getJoueurReagissant();
		this.joueurCourant = plateau.getJoueurCourant();
		
		btnJouerCarte = new JButton("     Jouer Carte     ");
		btnJouerCarte.setEnabled(false);
		panelActionJoueur.add(btnJouerCarte, "cell 0 0");
		btnJouerCarte.addActionListener(new ControllerInterfacePlateau(this));

		btnEchangerCartes = new JButton("Echanger Cartes ");
		panelActionJoueur.add(btnEchangerCartes, "cell 0 1");
		btnEchangerCartes.addActionListener(new ControllerInterfacePlateau(this));
		if( joueurReagissant == null || joueurCourant == joueurReagissant)
			btnEchangerCartes.setEnabled(true);
		else
			btnEchangerCartes.setEnabled(false);


		btnPasserTour = new JButton("    Terminer Tour  ");
		panelActionJoueur.add(btnPasserTour, "cell 0 2");
		btnPasserTour.addActionListener(new ControllerInterfacePlateau(this));
		if( joueurReagissant == null || joueurCourant == joueurReagissant)
			btnPasserTour.setEnabled(true);
		else
			btnPasserTour.setEnabled(false);
	}

	public void rafraichirPanelActionJoueur() {
		panelActionJoueur.removeAll();
		panelActionJoueur.revalidate();
		afficherPanelActionJoueur();
	}

	public void afficherPanelListeJoueurs() {
		int cpt = 0;
		for(int i = 0; i < plateau.getListeJoueurs().size(); i ++) { // Pour chaque joueur
			JPanel jpJoueur = new JPanel();
			jpJoueur.setBorder(new TitledBorder(null, plateau.listeJoueurs
					.get(i).getNom(), TitledBorder.LEADING, TitledBorder.TOP,
					null, null));
			GridBagConstraints gbc_Joueur = new GridBagConstraints();
			gbc_Joueur.insets = new Insets(0, 0, 5, 0);
			gbc_Joueur.fill = GridBagConstraints.BOTH;
			gbc_Joueur.gridx = 0;
			gbc_Joueur.gridy = i;

			panelListeJoueur.add(jpJoueur, gbc_Joueur);
			jpJoueur.setLayout(new BoxLayout(jpJoueur, BoxLayout.LINE_AXIS));

			JLabel lblGrimoire = new JLabel("" + plateau.listeJoueurs.get(i).getNbGemmes());
			lblGrimoire.setIcon(new ImageIcon(InterfacePlateau.class.getResource("/images/G.png")));
			jpJoueur.add(lblGrimoire);

			JPanel CarteGrimoire = new JPanel();
			CarteGrimoire.setBorder(new TitledBorder(null, "Grimoire",
					TitledBorder.LEADING, TitledBorder.TOP, null, null));
			jpJoueur.add(CarteGrimoire);
			CarteGrimoire.setLayout(new BoxLayout(CarteGrimoire,
					BoxLayout.X_AXIS));

			// Affichage des cartes du grimoire
			for(int j = 0; j < plateau.listeJoueurs.get(i).getGrimoire().size(); j++) {
				JLabel lblCarteGrimoire = new JLabel("");
				lblCarteGrimoire.setIcon(new ImageIcon(
						imageCarte = resize(plateau.listeJoueurs.get(i)
								.getGrimoire().get(j).getRecto(),
								widthGrimoireJoueurAtt, heightGrimoireJoueurAtt)));
				lblCarteGrimoire.setToolTipText(plateau.listeJoueurs.get(i)
						.getGrimoire().get(j).getInfoBulle());
				CarteGrimoire.add(lblCarteGrimoire);
			}
			cpt = plateau.listeJoueurs.get(i).getGrimoire().size();
			if(plateau.listeJoueurs.get(i).getGrimoire().size() < 3) {
				do {
					JLabel lblCarteVide = new JLabel("");
					lblCarteVide.setIcon(new ImageIcon(
							imageCarte = resize("Vide.png",
									widthGrimoireJoueurAtt, heightGrimoireJoueurAtt)));
					CarteGrimoire.add(lblCarteVide);
					cpt++;
				}while (cpt < 3);
			}
		}
	}
	public void rafraichirPanelListeJoueurs() {
		panelListeJoueur.removeAll();
		panelListeJoueur.revalidate();
		afficherPanelListeJoueurs();
	}

	public void afficherJoueurCourant() {
		final ButtonGroup groupeBoutonsCartes = new ButtonGroup();
		this.joueurCourant = plateau.getJoueurCourant();

		panelPlateauDeJeu.add(panelCartesJoueurCourant);
		tableCorrespondance.clear();
		panelCartesJoueurCourant.setBorder(new TitledBorder(null,
				"Joueur courant : " + joueurCourant.getNom() +" | Gemmes : "+joueurCourant.getNbGemmes(),
				TitledBorder.LEADING, TitledBorder.TOP, null, null));

		//Affichage du grimoire
		for (int i = 0; i < joueurCourant.getGrimoire().size(); i++) {
			JToggleButton jbutton = new JToggleButton("");
			imageCarte = resize(joueurCourant.getGrimoire().get(i).getRecto(), 95,
					160);
			jbutton.setIcon(new ImageIcon(imageCarte));
			jbutton.setToolTipText(joueurCourant.getGrimoire().get(i).getInfoBulle());

			grimoire.add(jbutton);

			groupeBoutonsCartes.add(jbutton);
			tableCorrespondance.put(jbutton, joueurCourant.getGrimoire().get(i));
			jbutton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					if((JToggleButton)arg0.getSource()!=null) {
						carteSelectionnee = tableCorrespondance.get((JToggleButton)arg0.getSource());
						btnJouerCarte.setEnabled(true);
					}
				}
			});
		}
		//Affichage de la main
		for (int i = 0; i < joueurCourant.getMain().size(); i++) {
			JToggleButton jbutton = new JToggleButton("");
			imageCarte = resize(joueurCourant.getMain().get(i).getRecto(),
					95, 160);
			jbutton.setIcon(new ImageIcon(imageCarte));
			jbutton.setToolTipText(joueurCourant.getMain().get(i).getInfoBulle());
			main.add(jbutton);
			groupeBoutonsCartes.add(jbutton);
			tableCorrespondance.put(jbutton, joueurCourant.getMain().get(i));
			jbutton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					if((JToggleButton)arg0.getSource()!=null) {
						carteSelectionnee = tableCorrespondance.get((JToggleButton)arg0.getSource());
						btnJouerCarte.setEnabled(true);
					}
				}
			});
		}
	}
	public void rafraichirPanelJoueurCourant() {

		//Rafraichissement du grimoire
		grimoire.removeAll();
		grimoire.revalidate();
		//Rafraichissement de la main
		main.removeAll();
		main.revalidate();
		afficherJoueurCourant();
	}

	public void afficherJoueurReagissant() {
		this.joueurReagissant = plateau.getJoueurReagissant();
		final ButtonGroup groupeBoutonsCartes = new ButtonGroup();

		panelPlateauDeJeu.add(panelCartesJoueurCourant);
		tableCorrespondance.clear();
		panelCartesJoueurCourant.setBorder(new TitledBorder(null,
				"Joueur reagissant : " + joueurReagissant.getNom(),
				TitledBorder.LEADING, TitledBorder.TOP, null, null));

		//Affichage du grimoire
		for (int i = 0; i < joueurReagissant.getGrimoire().size(); i++) {
			JToggleButton jbutton = new JToggleButton("");
			imageCarte = resize(joueurReagissant.getGrimoire().get(i).getRecto(), 95,
					160);
			jbutton.setIcon(new ImageIcon(imageCarte));
			jbutton.setToolTipText(joueurReagissant.getGrimoire().get(i).getInfoBulle());
			grimoire.add(jbutton);

			groupeBoutonsCartes.add(jbutton);
			tableCorrespondance.put(jbutton, joueurReagissant.getGrimoire().get(i));
			jbutton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					if((JToggleButton)arg0.getSource()!=null) {
						carteSelectionnee = tableCorrespondance.get((JToggleButton)arg0.getSource());
						btnJouerCarte.setEnabled(true);
					}
				}
			});
		}
		//Affichage de la main
		for (int i = 0; i < joueurReagissant.getMain().size(); i++) {
			JToggleButton jbutton = new JToggleButton("");
			imageCarte = resize(joueurReagissant.getMain().get(i).getRecto(),
					95, 160);
			jbutton.setIcon(new ImageIcon(imageCarte));
			jbutton.setToolTipText(joueurReagissant.getMain().get(i).getInfoBulle());
			main.add(jbutton);
			groupeBoutonsCartes.add(jbutton);
			tableCorrespondance.put(jbutton, joueurReagissant.getMain().get(i));
			jbutton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					if((JToggleButton)arg0.getSource()!=null) {
						carteSelectionnee = tableCorrespondance.get((JToggleButton)arg0.getSource());
						btnJouerCarte.setEnabled(true);
					}
				}
			});
		}
	}

	public void rafraichirPanelJoueurReagissant() {
		//Rafraichissement du grimoire
		grimoire.removeAll();
		grimoire.revalidate();
		//Rafraichissement de la main
		main.removeAll();
		main.revalidate();
		afficherJoueurReagissant();
	}

	public void afficherPanelChaudron() {
		JLabel lblValeur = new JLabel("= "+ plateau.getChaudron().recupererNbGemmes());
		lblValeur.setIcon(new ImageIcon(InterfacePlateau.class.getResource("/images/gemmes.png")));
		panelChaudron.add(lblValeur);
	}

	public void rafraichirPanelChaudron() {
		panelChaudron.removeAll();
		panelChaudron.revalidate();
		afficherPanelChaudron();
	}

	public void afficherPanelZoneDeJeu() {
		JLabel lblZoneDeJeu = new JLabel("");
		if(plateau.zoneDeJeu.isEmpty()) 
			imageCarte = resize("Vide.png", 145, 225);
		else {
			imageCarte = resize(plateau.zoneDeJeu.get(plateau.zoneDeJeu.size() - 1).getRecto(), 145, 225);
			lblZoneDeJeu.setToolTipText(plateau.zoneDeJeu.get(plateau.zoneDeJeu.size() - 1).getInfoBulle());
		}
		lblZoneDeJeu.setIcon(new ImageIcon(imageCarte));
		panelZoneDeJeu.add(lblZoneDeJeu);
	}

	public void rafraichirPanelZoneDeJeu() {
		System.out.println("Size ZDJ: " + plateau.getZoneDeJeu().size());
		panelZoneDeJeu.removeAll();
		panelZoneDeJeu.revalidate();
		afficherPanelZoneDeJeu();
	}

	public void afficherPanelBibliotheque() {
		JLabel lblNombreCarteRestantes = new JLabel("Cartes restantes: "
				+ plateau.getBibliotheque().getPile().size());
		panelBibliotheque.add(lblNombreCarteRestantes);

		JLabel lblBibliotheque = new JLabel("");
		lblBibliotheque.setAlignmentY(Component.BOTTOM_ALIGNMENT);
		lblBibliotheque.setHorizontalAlignment(SwingConstants.CENTER);
		lblBibliotheque.setIcon(new ImageIcon(InterfacePlateau.class
				.getResource("/images/Recto_100x142.png")));
		panelBibliotheque.add(lblBibliotheque);
	}

	public void rafraichirPanelBibliotheque() {
		panelBibliotheque.removeAll();
		panelBibliotheque.revalidate();
		afficherPanelBibliotheque();
	}

	public void afficherPanelDefausse() {

		lblCarteDefausse = new JLabel("Cartes defausse: "+ plateau.getDefausse().getPile().size());
		lblCarteDefausse.setHorizontalAlignment(SwingConstants.CENTER);
		lblCarteDefausse.setAlignmentY(3.0f);
		panelDefausse.add(lblCarteDefausse);

		imageCarteDefausse = new JLabel("");
		imageCarteDefausse.setHorizontalAlignment(SwingConstants.CENTER);

		if(plateau.getDefausse().getPile().isEmpty()) 
			imageCarte = resize("Recto_100x142.png", 100, 142);
		else {
			imageCarte = resize(plateau.getDefausse().getPile().peek().getRecto(), 100, 142);
		}
		imageCarteDefausse.setIcon(new ImageIcon(imageCarte));
		panelDefausse.add(imageCarteDefausse);


	}

	public void rafraichirPanelDefausse() {
		panelDefausse.removeAll();
		panelDefausse.revalidate();
		afficherPanelDefausse();
	}

	public void rafraichirPlateauEntier() {
		rafraichirPanelBibliotheque();
		rafraichirPanelDefausse();
		rafraichirPanelChaudron();
		rafraichirPanelJoueurCourant();
		rafraichirPanelListeJoueurs();
		rafraichirPanelZoneDeJeu();
		rafraichirPanelActionJoueur();
	}

	/**
	 * Fonction pour redimensionner les cartes
	 * 
	 */
	public static BufferedImage resize(String nomImageCarte, int width,
			int height) {
		BufferedImage img = null;
		ImprovedMultistepRescaleOp resampleOp = new ImprovedMultistepRescaleOp(
				width, height);
		try {
			img = ImageIO.read(new File("./src/images/"
					+ nomImageCarte.replace("hocusPocus.Cartes.", "")));
		} catch (IOException e) {
			e.printStackTrace();
		}
		return resampleOp.filter(img, null);
	}

	public Carte getCarteSelectionee() {
		return carteSelectionnee;
	}
	public JPanel getGrimoire() {
		return grimoire;
	}

	public void setGrimoire(JPanel grimoire) {
		this.grimoire = grimoire;
	}

	public JPanel getMain() {
		return main;
	}

	public void setMain(JPanel main) {
		this.main = main;
	}
	
	
	
}

